package com.tedu.api.socket.thread;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式--> () -> {}【接口/抽象类--匿名内部类】
 *                         【集合遍历--匿名内部类】
 * Collection-->List:存重复元素并且有序
 *              Set:存无序并且不重复
 *              Queue:队列结合业务
 *Map-------------H ashMap：键值对
 */
public class LambdaDemo {
    @Test
    public void testList() {
        //List集合：保存元素
        List<String> list = new ArrayList<>();
        list.add("白洋淀");
        list.add("正定古城");
        list.add("河头老街");
        list.add("白云山");
        //集合3种遍历方式：普通for 增强for forEach方法
        for (String str : list) {
            System.out.println("增强for：" + str);
        }
        //支持forEach方法：遍历集合元素
        //Consumer接口针对List，Queue集合提供接口：功能获取list集合元素
        //accept()获取list集合的所有元素
        list.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println("consumer接口遍历方案：" + s);
            }
        });
        //支持forEach方法：遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式元素
        list.forEach(s -> System.out.println("consumer遍历方案：" + s));
    }

    @Test
    public void testMap() {
        //创建Map集合：键值对
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "唐山");
        map.put(2, "石家庄");
        map.put(3, "秦皇岛");
        map.put(4, "邯郸");
        //遍历集合:普通for 增强for forEach(BiConSummer接口--匿名内部类)
        //键值对-->一组Entry对象
        //BiConSummer接口---获取每组Entry对象--accept()获取Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键：" + integer + "值：" + s);
            }
        });
        //使用Lambda表达式
        map.forEach((i, s) -> System.out.println("lambda值：" + s));
    }

    /**
     * 作业：1.使用Lambda表达式完成Thread线程创建[TR]
     * 2.使用Lambda表达式完成Runnable线程创建
     * 3.IO流--File类：listFile(FileFilter接口)【5行代码】
     * 目标：【io包下FilterAPI类】实现使用Lambda表达式完成
     * 4.IO流--File类：listFile(FileFilter接口)【2行代码】
     * 目标：【io包下FilterAPI类】实现使用Lambda表达式完成
     * 5.集合:改成lambda写法
     * 目标:【list包下ListAPI类单元测试:testComputer】
     * Lambda类下--完成作业
     *
     * @
     */
    @Test
    public void LambdaHomeWork1() {
        //使用Lambda表达式完成Thread线程创建
        //Thread类Java定义线程类--具备启动start--
        //Thread类封装Runnable类--线程run运行
        Thread t1 = new Thread(() -> {
            for (int i = 0; i > 1000; i++) {
                System.out.println("玛卡巴卡宝宝~~");
            }
        });
        t1.start();
    }

    @Test
    public void LambdaHomeWork2() {
        //1.创建Runnable接口--run()
        Runnable mr1 = () -> {
            for (int i = 0; i < 1000; i++) {
                System.out.println("永夜星河~~");
            }
        };
        //2.创建Thread线程类---start()
        Thread t2 = new Thread(mr1);
        //3.启动线程
        t2.start();
    }

    @Test
    public void LambdaHomeWork3() {
        File file = new File("." + File.separator );

        FileFilter ff = name->name.getName().startsWith("s");
        File[] f = file.listFiles(ff);
        for (int i = 0; i < f.length; i++) {System.out.println("过滤的文件和文件夹的名字：" + f[i].getName());}
    }


    @Test
    public void LambdaHomeWork4() {
        for ( File w:new File("."+File.separator).listFiles((pathname)->pathname.getName().startsWith("s"))){
            System.out.println("过滤的文件和文件夹的名字"+w);
        }
    }
    @Test
    public void LambdaHomeWork5() {
        List<String> list=new ArrayList<>();
        list.add("玛卡巴卡");
        list.add("依古比古");
        list.add("小点点");
        list.add("飞飞🐟");
        Comparator <String>cp=((o1, o2) -> {return o2.length()-o1.length();});
     //   Collection.sort(list,cp);
        System.out.println("排序后集合："+list);
    }
}
